home *** CD-ROM | disk | FTP | other *** search
/ Merciful 5 / Merciful - Disc 5.iso / software / p / pcqpascalv1.2d.lha / Examples2 / Dial / Dial.p < prev    next >
Text File  |  1997-05-06  |  37KB  |  1,319 lines

  1. Program Dial;
  2.  
  3. {   Dieses Programm ist Cardware !
  4.     Wenn es Dir gefällt oder Du Teile des Quellcodes verwendest,
  5.     dann schick mir bitte eine Postkarte oder eine email.
  6.            
  7.     Andreas Tetzl
  8.     Liebethaler Str. 18
  9.     01796 Pirna
  10.     
  11.     email: A.TETZL@saxonia.sn.in-berlin.de
  12.  
  13.     compiler: PCQ-Pascal v1.2d mit OS3.1 Includes
  14. }
  15.  
  16. {///"Includes"}
  17. {$I "Include:Utils/StringLib.i"}
  18. {$I "Include:DOS/DOS.i"}
  19. {$I "Include:DOS/RDArgs.i"}
  20. {$I "Include:Intuition/Intuition.i"}
  21. {$I "Include:Intuition/IntuitionBase.i"}
  22. {$I "Include:Intuition/sgHooks.i"}
  23. {$I "Include:Libraries/GadTools.i"}
  24. {$I "Include:Exec/Libraries.i"}
  25. {$I "Include:Exec/Ports.i"}
  26. {$I "Include:Exec/Memory.i"}
  27. {$I "Include:Exec/Nodes.i"}
  28. {$I "Include:Exec/Lists.i"}
  29. {$I "Include:Utility/Utility.i"}
  30. {$I "Include:Utils/TagUtils.i"}
  31. {$I "Include:Utils/StrToInt.i"}
  32. {$I "Include:Utils/Parameters.i"}
  33. {$I "Include:Libraries/Commodities.i"}
  34. {$I "Include:Workbench/Startup.i"}
  35. {$I "Include:Workbench/WorkBench.i"}
  36. {$I "Include:Workbench/Icon.i"}
  37. {///}
  38.  
  39. {///"TYPE"}
  40. Type
  41.     NumberNode = Record
  42.      ExecNode : Node;
  43.      Number : Array[0..31] of Char;
  44.     end;
  45.     NumberNodePtr = ^NumberNode;
  46. {///}
  47.  
  48. {///"CONST"}
  49. CONST
  50.  StdInName : String = NIL;
  51.  StdOutName : String = NIL;
  52.  
  53.  StdHotkey = "alt f1";
  54.  StdPhoneBook = "Telefonbuch";
  55.  
  56.  version = "$VER: Dial 1.1 (19.2.95)";
  57.  
  58.  TopazAttr : TextAttr = ("topaz.font",8,FS_NORMAL,FPF_ROMFONT);
  59.  
  60.  ng : Array[0..3] of NewGadget = (
  61.                (10,16,280,83,"Name",@TopazAttr,0,PLACETEXT_ABOVE,NIL,NIL),
  62.                (10,98,280,15,NIL,@TopazAttr,1,0,NIL,NIL),
  63.                (10,117,100,15,"Wählen",@TopazAttr,2,PLACETEXT_IN,NIL,NIL),
  64.                (190,117,100,15,"Verbergen",@TopazAttr,3,PLACETEXT_IN,NIL,NIL));
  65.  
  66.  Gadget_Types : Array[0..3] of Short = ( LISTVIEW_KIND,
  67.                                          STRING_KIND,
  68.                                          BUTTON_KIND,
  69.                                          BUTTON_KIND);
  70.  
  71.  
  72.  nm : Array[0..6] of NewMenu = (
  73.         (NM_Title,"Projekt",NIL,0,0,NIL),
  74.         (NM_Item,"Verbergen ","H",0,0,NIL),
  75.         (NM_Item,"Info      ","A",0,0,NIL),
  76.         (NM_Item,"Beenden   ","Q",0,0,NIL),
  77.         (NM_Title,"Telefonbuch",NIL,0,0,NIL),
  78.         (NM_Item,"neu laden","T",0,0,NIL),
  79.         (NM_END,NIL,NIL,0,0,NIL));
  80.  
  81.  
  82.     EVT_HOTKEY : Integer = 1;
  83.  
  84.  
  85.     nb : newbroker = (
  86.  
  87.     NB_VERSION,
  88.     "Dial",           { string to identify this broker }
  89.     "Dial V1.1 @ 1995 by Andreas Tetzl",
  90.     "Wählt Telefonnummern mit MFV",
  91.     NBU_UNIQUE OR NBU_NOTIFY,    
  92.     COF_SHOW_HIDE, 0, NIL, 0
  93.     );
  94. {///}
  95.  
  96. {///"VAR"}
  97. VAR Str, Title : String;
  98.     IB : IntuitionBasePtr;
  99.     i,j : Integer;
  100.     Win : WindowPtr;
  101.     Scr : ScreenPtr;
  102.     GList : GadgetPtr;
  103.     Gads : Array[0..3] of GadgetPtr;
  104.     CMsg : CxMsgPtr;
  105.     vi : Address;
  106.     TagList : Address;
  107.     DirLock : FileLock;
  108.     position : Integer;
  109.     broker_mp : MsgPortPtr;
  110.     broker,filter,sender,Ctranslate : CxObjPtr;
  111.     cxsigflag : Integer;
  112.     msgid, msgtype : Integer;
  113.     returnvalue : Boolean;
  114.     MenuStrip : MenuPtr;
  115.     CX_POPUP : Boolean;
  116.     CX_POPKEY : String;
  117.     CX_PRIORITY : Integer;
  118.     PhoneBook : String;
  119.     SortList : Boolean;
  120.     entries : Integer;
  121.     Numbers : ListPtr;
  122.     num : Integer;  { Nummer des selektierten Eintrages im ListView }
  123.     null_request : Requester;  { Um das Fenster zu blockieren }
  124.     OS3 : Boolean;
  125.     ScrFont : TextAttrPtr;
  126.     Win_Width, Win_Height : Integer;  { Wird von LayoutGadgets() gesetzt }
  127.     longname : String;  { Wird von AddNumber() gesetzt. Die Breite des Fensters }
  128.                         { richtet sich nach der Länge dies Strings. }
  129.     MyHook : Hook;
  130.     MySGWork : SGWorkPtr;     { Für den Edithook des StrGads }
  131.     SGH : Integer;
  132. {///}
  133.  
  134. {///"PROCEDURE CloseWin"}
  135. PROCEDURE CloseWin;
  136. VAR Msg : MessagePtr;
  137. Begin
  138.  If Win=NIL then Return;
  139.  { Nachichten vom IDCMP-Port entfernen }
  140.  Msg:=GetMsg(Win^.UserPort);
  141.  While Msg<>NIL do
  142.   Begin
  143.    ReplyMsg(Msg);
  144.    Msg:=GetMsg(Win^.UserPort);
  145.   end;
  146.  IF Win<>NIL THEN 
  147.   Begin
  148.    CloseWindow(Win);
  149.    Win:=NIL;
  150.   end;
  151.  IF GList<>NIL THEN 
  152.   Begin
  153.    FreeGadgets(GList);
  154.    Dispose(GList);
  155.    GList:=NIL;
  156.   end;
  157.  
  158.  If MenuStrip<>NIL then 
  159.   Begin
  160.    FreeMenus(MenuStrip);
  161.    MenuStrip:=NIL;
  162.   end;
  163.  
  164.  IF vi<>NIL THEN 
  165.   Begin
  166.    FreeVisualInfo(vi);
  167.    vi:=NIL;
  168.   end;
  169.  IF Scr<>NIL THEN 
  170.   Begin
  171.    UnlockPubScreen(NIL,Scr);
  172.    Scr:=NIL;
  173.   end;
  174. end;
  175. {///}
  176.  
  177. {///"PROCEDURE Req"}
  178. PROCEDURE Req(Txt : String);
  179. const
  180.     es : EasyStruct = (0,0,NIL,NIL,NIL);
  181.  
  182. VAR i : Integer;
  183.  
  184. begin
  185.  es.es_StructSize:=SizeOf(EasyStruct);
  186.  es.es_Flags:=0;
  187.  es.es_Title:="Info";
  188.  es.es_TextFormat:=Txt;
  189.  es.es_GadgetFormat:="OK";
  190.  
  191.  i:=EasyRequestArgs(NIL,adr(es),0,NIL);
  192. END;
  193. {///}
  194.  
  195. {///"PROCEDURE AddNumber"}
  196. PROCEDURE AddNumber(Name, Number : String);
  197. VAR NewNode, MyNode : NumberNodePtr;
  198. Begin
  199.  { Längsten String merken (für LayoutGadgets) }
  200.  If StrLen(name)>StrLen(longname) then StrCpy(longname,name);
  201.  
  202.  New(NewNode);
  203.  NewNode^.execnode.ln_Name:=AllocString(128);
  204.  StrnCpy(NewNode^.execnode.ln_Name,Name,Strlen(Name)-1);
  205.  StrnCpy(adr(NewNode^.Number),Number,Strlen(Number)-1);
  206.  
  207.  If SortList=FALSE then     { NoSort aktiv }
  208.   Begin
  209.    AddTail(Numbers,NodePtr(NewNode));
  210.    Inc(entries);
  211.    Return;
  212.   end;
  213.  
  214.  { NoSort nicht aktiv ... }
  215.  
  216.  MyNode:=NumberNodePtr(Numbers^.lh_Head);
  217.  
  218.  If entries=0 then  { erster Eintrag }
  219.   Begin
  220.    AddTail(Numbers,NodePtr(NewNode));
  221.    Inc(entries);
  222.    Return;
  223.   end;
  224.  
  225.  If StriCmp(Name,MyNode^.execnode.ln_Name)<0 then
  226.   begin
  227.    AddHead(Numbers,NodePtr(NewNode));  { vor den ersten Eintrag }
  228.    Inc(entries);
  229.    Return;
  230.   end;
  231.  
  232.  While MyNode<>NIL do
  233.   Begin
  234.    If (StriCmp(Name,MyNode^.execnode.ln_Name)>=0) and
  235.       (StriCmp(Name,MyNode^.execnode.ln_Succ^.ln_name)<0) then
  236.     Begin
  237.      Insert(Numbers,NodePtr(NewNode),NodePtr(MyNode));  { einfügen }
  238.      Inc(entries);
  239.      Return;
  240.     end;
  241.    MyNode:=NumberNodePtr(MyNode^.execnode.ln_succ);
  242.   end;
  243.  
  244.  AddTail(Numbers,NodePtr(NewNode));    { hinten anhängen }
  245.  Inc(entries);
  246. END;
  247. {///}
  248.  
  249. {///"PROCEDURE FreeNumbers"}
  250. PROCEDURE FreeNumbers;
  251. VAR MyNode, Nextnode : NumberNodePtr;
  252. Begin
  253.  StrCpy(longname,"");
  254.  
  255.  MyNode:=NumberNodePtr(RemTail(Numbers));
  256.  While MyNode<>NIL do
  257.   Begin
  258.    FreeString(MyNode^.execnode.ln_Name);
  259.    Dispose(MyNode);
  260.    MyNode:=NumberNodePtr(RemTail(Numbers));
  261.   end;
  262. end;
  263. {///}
  264.  
  265. {///"PROCEDURE GetNumber"}
  266. FUNCTION GetNumber(num : WORD) : String;
  267. VAR MyNode : NumberNodePtr;
  268.     i : Integer;
  269. begin
  270.  If num<0 then GetNumber:=NIL;
  271.  i:=0;
  272.  MyNode:=NumberNodePtr(Numbers^.lh_Head);
  273.  While MyNode<>NIL do
  274.   begin
  275.    If i=num then GetNumber:=adr(MyNode^.Number);
  276.    Inc(i);
  277.    MyNode:=NumberNodePtr(MyNode^.execnode.ln_succ);
  278.   end;
  279.  
  280.  GetNumber:=NIL;
  281. end;
  282. {///}
  283.  
  284. {///"PROCEDURE SearchName"}
  285. FUNCTION SearchName(c : Char) : Integer;
  286. { Sucht nach einem Eintrag, der mit einem bestimmten Buchstaben
  287.   anfängt. }
  288. VAR MyNode : NumberNodePtr;
  289.     i : Integer;
  290. begin
  291.  i:=0;
  292.  MyNode:=NumberNodePtr(Numbers^.lh_Head);
  293.  While MyNode<>NIL do
  294.   begin
  295.    If ToUpper(c)=ToUpper(MyNode^.execnode.ln_name[0]) then SearchName:=i;
  296.    Inc(i);
  297.    MyNode:=NumberNodePtr(MyNode^.execnode.ln_succ);
  298.   end;
  299.  
  300.  SearchName:=-1;   { Nicht gefunden }
  301. end;
  302. {///}
  303.  
  304. {///"PROCEDURE CleanExit"}
  305. PROCEDURE CleanExit(Why : String; RC:Integer);
  306. VAR Msg : MessagePtr;
  307. Begin
  308.  If Win<>NIL then CloseWin;
  309.  
  310.  { Nachichten entfernen }
  311.  If broker_mp<>NIL then
  312.   Begin
  313.    CMsg:=CxMsgPtr(GetMsg(broker_mp));
  314.    While CMsg<>NIL do
  315.     Begin
  316.      ReplyMsg(MessagePtr(Cmsg));
  317.      CMsg:=CxMsgPtr(GetMsg(broker_mp));
  318.     end;
  319.    DeleteMsgPort(broker_mp);
  320.   end;
  321.  If Broker<>NIL then DeleteCxObjAll(broker);
  322.  If CxBase<>NIL then CloseLibrary(CxBase);
  323.  IF gadToolsBase<>NIL THEN CloseLibrary(GadToolsBase);
  324.  IF UtilityBase<>NIL THEN CloseLibrary(UtilityBase);
  325.  If IB<>NIL then CloseLibrary(LibraryPtr(IB));
  326.  FreeNumbers;
  327.  
  328.  If Why<>NIL then Req(Why);
  329.  FreeString(Str);
  330.  FreeString(CX_POPKEY);
  331.  FreeString(Title);
  332.  FreeString(PhoneBook);
  333.  FreeString(longName);
  334.  Dispose(Numbers);
  335.  Exit(RC);
  336. end;
  337. {///}
  338.  
  339. {///"PROCEDURE LockWindow"}
  340. PROCEDURE LockWindow(Win : WindowPtr; MyReq : RequesterPtr);
  341. const
  342.   waitPointer : CHIP Array[0..35] of WORD =
  343.    (
  344.     $0000, $0000,     { reserved, must be NULL }
  345.  
  346.     $0400, $07C0,
  347.     $0000, $07C0,
  348.     $0100, $0380,
  349.     $0000, $07E0,
  350.     $07C0, $1FF8,
  351.     $1FF0, $3FEC,
  352.     $3FF8, $7FDE,
  353.     $3FF8, $7FBE,
  354.     $7FFC, $FF7F,
  355.     $7EFC, $FFFF,
  356.     $7FFC, $FFFF,
  357.     $3FF8, $7FFE,
  358.     $3FF8, $7FFE,
  359.     $1FF0, $3FFC,
  360.     $07C0, $1FF8,
  361.     $0000, $07E0,
  362.  
  363.     $0000, $0000      { reserved, must be NULL }
  364.     );
  365.  
  366. Begin
  367.  If Win=NIL then Return;
  368.  
  369.  InitRequester(MyReq);
  370.  If Request(adr(null_request),Win) then
  371.   SetPointer(Win,adr(WaitPointer),16,16,-6,0);
  372. end;
  373. {///}
  374.  
  375. {///"PROCEDURE UnlockWindow"}
  376. PROCEDURE UnlockWindow(Win : WindowPtr; MyReq : RequesterPtr);
  377. Begin
  378.  If Win=NIL then Return;
  379.  ClearPointer(Win);
  380.  EndRequest(MyReq,Win);
  381. end;
  382. {///}
  383.  
  384. {///"PROCEDURE ReadPhoneBook"}
  385. PROCEDURE ReadPhoneBook;
  386. VAR Datei : FileHandle;
  387.     name, num : String;
  388.     OldLock : FileLock;
  389. Begin
  390.  name:=AllocString(128);
  391.  num:=AllocString(32);
  392.  
  393.  If DirLock<>NIL then OldLock:=CurrentDir(DirLock);
  394.  Datei:=DOSOpen(PhoneBook,MODE_OLDFILE);
  395.  If DirLock<>NIL then OldLock:=CurrentDir(OldLock);
  396.  
  397.  If Datei=NIL then
  398.   Begin
  399.    StrCpy(Str,"Finde Telefonbuchdatei\n\"");
  400.    StrCat(Str,PhoneBook);
  401.    StrCat(Str,"\" nicht");
  402.    CleanExit(Str,10);
  403.   end;
  404.  
  405.  entries:=0;
  406.  
  407.  Repeat
  408.   Str:=FGets(Datei,Str,128);
  409.   While (IsAlpha(Str[0])=FALSE) and (Str<>NIL) do Str:=FGets(Datei,Str,128);
  410.   If Str=NIL then
  411.    Begin
  412.     DOSClose(Datei);
  413.     FreeString(name);
  414.     FreeString(num);
  415.     Return;
  416.    end;
  417.   StrCpy(name,Str);
  418.   
  419.   Str:=FGets(Datei,Str,64);
  420.   While (Str[0]<>'#') and (Str<>NIL) do Str:=FGets(Datei,Str,128);
  421.   If Str=NIL then
  422.    Begin
  423.     DOSClose(Datei);
  424.     FreeString(name);
  425.     FreeString(num);
  426.     Return;
  427.    end;
  428.  
  429.   StrCpy(num,adr(Str[1]));
  430.   AddNumber(name,num);
  431.  Until FALSE;
  432. end;
  433. {///}
  434.  
  435. {///"PROCEDURE Dial"}
  436. PROCEDURE Dial(number : String);
  437. Begin
  438. {$A
  439. ; This source dials a number, it can do either DTMF or CCITT5. It has built
  440. ; in letter recognition. Ie ABC -> 1, DEF -> 2 which can be switched off.
  441. ; It is also variable speed. Feel free to use in your programmes.
  442. ;
  443. ; NB: This isnt the source of the programme dial, just the routine which
  444. ; dials numbers. Dial is merely a frontend to this:
  445.  
  446. ; some vars from hardware/custom.i
  447.  
  448. dmacon      EQU   $096
  449. adkcon      EQU   $09E
  450.  
  451. aud         EQU   $0A0
  452. aud0        EQU   $0A0
  453. aud1        EQU   $0B0
  454. aud2        EQU   $0C0
  455. aud3        EQU   $0D0
  456.  
  457. * AudChannel
  458. ac_ptr      EQU   $00   ; ptr to start of waveform data
  459. ac_len      EQU   $04   ; length of waveform in words
  460. ac_per      EQU   $06   ; sample period
  461. ac_vol      EQU   $08   ; volume
  462. ac_dat      EQU   $0A   ; sample pair
  463. ac_SIZEOF   EQU   $10
  464.  
  465.  
  466.         move.l  4(sp),a0     ; Parameter nach a0
  467.  
  468.         movem.l d1/d4-d7/a3-a5,-(sp)                ;a0=number in ascii         
  469.         lea     DTMF,a1                             ;chr(0) to end
  470. Start   move.l  a0,a4
  471.         move.l  a1,a5
  472.         moveq   #SnSize,d0
  473.         moveq   #2,d1                               ;MEMF_CHIP
  474.         move.l  $4,a6
  475.         jsr     -198(a6)                            ;AllocMem()
  476.         move.l  d0,a0
  477.         move.l  #SnWaveS,a1
  478.         moveq   #SnSize-1,d1
  479.  
  480. CopyBf  move.b  (a1)+,(a0)+
  481.         dbf     d1,CopyBf
  482.  
  483.         move.l  a5,a1
  484.         move.l  a4,a0
  485.  
  486.         clr.l   d2
  487.         move.b  Speed,d2
  488.  
  489. NextTone
  490.         clr.l   d1
  491.         move.b  (a0)+,d1                            
  492.         cmp.b   #'*',d1
  493.         beq     Special
  494.         cmp.b   #"#",d1
  495.         beq     Special
  496.  
  497.         cmp.b   #"0",d1
  498.         blt     SkipNote
  499.         cmp.b   #"9",d1
  500.         bgt     NotDigit
  501.  
  502.         sub.b   #"0",d1
  503. DoneConv
  504.         lsl     #2,d1                               ;*4
  505.         move.w  0(a1,d1.w),d4                       ;Lookup table in words
  506.         move.w  2(a1,d1.w),d5                       ;get period of both tones
  507.         bsr     SoundTone
  508.         bra     Pause
  509. SkipNote
  510.         tst.b   (a0)
  511.         bne     NextTone
  512.  
  513.         move.l  d0,a1
  514.         moveq   #SnSize,d0
  515.         move.l  $4,a6
  516.         jsr     -210(a6)                            ;FreeMem()
  517.  
  518.         movem.l (sp)+,d1/d4-d7/a3-a5
  519.         rts
  520.  
  521. Special moveq.w #10,d1                              ;* & #
  522.         cmpi.b  #"#",d1                             ;(does anyone want the
  523.         bne     NoAdN                               ;a,b,c or d tones?)
  524.         addq.w  #1,d1
  525. NoAdN   bra     DoneConv
  526.  
  527. NotDigit                                            ;Handles a-y
  528.         tst.b   Letter                              ;-nl -ignore letters
  529.         bne     SkipNote
  530.         
  531.         cmp.b   #"Q",d1                             ;Q & Z = 1
  532.         beq     DoLQZ
  533.         cmp.b   #"Z",d1
  534.         beq     DoLQZ       
  535.         bgt     SmallCase
  536.         cmp.b   #"A",d1                             ;=> 1-9
  537.         blt     SkipNote
  538.         cmp.b   #"Q",d1
  539.         blt     NoDif
  540.         subq.b  #1,d1
  541. NoDif   sub.b   #59,d1
  542.         divu    #3,d1
  543.         bra     DoneConv
  544. DoLQZ   move.l  #1,d1
  545.         bra     DoneConv
  546.  
  547. SmallCase
  548.         cmp.b   #"z",d1
  549.         beq     DoLQZ                               ;Q and Z come on the 
  550.         bgt     SkipNote
  551.         cmp.b   #"q",d1                             ;Number 1 button 
  552.         beq     DoLQZ                               ;sometimes
  553.         cmp.b   #"a",d1
  554.         blt     SkipNote
  555.         cmp.b   #"q",d1
  556.         blt     NoDifS
  557.         subq.b  #1,d1
  558. NoDifS  sub.b   #91,d1
  559.         divu    #3,d1
  560.         bra     DoneConv
  561.  
  562. SoundTone
  563.         lea     $dff000,a5
  564.         lea     aud1(a5),a3                         ;Right channel only
  565.         lea     aud2(a5),a4                         ;N.B Don't be clever
  566.         move.w  #$000f,dmacon(a5)                   ;and use stereo it 
  567.         move.l  d0,(a3)                             ;doesn't work then.
  568.         move.l  d0,(a4)
  569.         move.w  #SnSize/2,ac_len(a3)
  570.         move.w  #SnSize/2,ac_len(a4)
  571.         move.w  #64,ac_vol(a3)
  572.         move.w  #64,ac_vol(a4)
  573.         move.w  d4,ac_per(a3)
  574.         move.w  d5,ac_per(a4)
  575.         move.w  #$00ff,adkcon(a5)
  576.         move.w  #$8206,dmacon(a5)
  577.  
  578. timedelay
  579.         bsr     GetTime
  580.         move.l  d7,d6
  581. Cont    bsr     GetTime
  582.         sub.l   d6,d7
  583.         cmp.l   d2,d7
  584.         bgt     StopNote        
  585.         bra     Cont
  586.  
  587. StopNote
  588.         move.w  #$0006,dmacon(a5)
  589.         rts
  590.  
  591. Pause   bsr     GetTime
  592.         move.l  d7,d6
  593. Cont2   bsr     GetTime
  594.         sub.l   d6,d7
  595.         cmpi.l  #2,d7
  596.         bgt     SkipNote
  597.         bra     Cont2
  598.  
  599. GetTime clr.l   d7                                  ;Stuff the timer.device
  600.         move.b  $bfea01,d7                          ;we programme direct
  601.         lsl.l   #4,d7                               ;via PIA
  602.         lsl.l   #4,d7
  603.         move.b  $bfe901,d7
  604.         lsl.l   #4,d7
  605.         lsl.l   #4,d7
  606.         move.b  $bfe801,d7
  607.         rts
  608.  
  609.         even
  610. DTMF    dc.w    238,166                         ;0
  611.         dc.w    319,186                         ;1
  612.         dc.w    319,166                         ;2
  613.         dc.w    319,151                         ;3
  614.         dc.w    290,184                         ;4
  615.         dc.w    290,166                         ;5
  616.         dc.w    290,151                         ;6
  617.         dc.w    263,184                         ;7
  618.         dc.w    263,166                         ;8
  619.         dc.w    263,151                         ;9
  620.         dc.w    238,184                         ;* 
  621.         dc.w    238,151                         ;# 
  622.  
  623. Speed   dc.b    5                               ;Speed
  624. Letter  dc.b    1                               ;0 = use letter recognitiion
  625.  
  626.         even
  627. SnWaveS
  628.         dc.b    0,49
  629.         dc.b    90,117
  630.         dc.b    127,117
  631.         dc.b    90,49
  632.         dc.b    0,-49
  633.         dc.b    -90,-117
  634.         dc.b    -127,-117
  635.         dc.b    -90,-49
  636. SnWaveE 
  637. SnSize  EQU SnWaveE-SnWaveS
  638.  
  639. }
  640. end;
  641. {///}
  642.  
  643. {///"PROCEDURE About"}
  644. PROCEDURE About;
  645. const
  646.     lines = 11;
  647.     txt : Array[1..lines] of String =
  648.           ("Dial V1.1\n",
  649.            "Datum: 19.02.1995\n",
  650.            "Copyright © 1995 by Andreas Tetzl\n\n",
  651.            "ThanX to Andrew Leppard 4 his dial engine.\n",
  652.            "Dieses Programm ist Cardware.\n",
  653.            "Wenn es Dir gefällt, dann schick' mir bitte\n",
  654.            "eine Postkarte oder eine email.\n",
  655.            "\nAndreas Tetzl\n",
  656.            "Liebethaler Str. 18\n",
  657.            "01796 Pirna\n",
  658.            "\nemail: A.TETZL@saxonia.sn.in-berlin.de");
  659.  
  660. VAR body : String;
  661.     i : Integer;
  662.  
  663. begin
  664.  body:=AllocString(300);
  665.  StrCpy(body,"");
  666.  For i:=1 to lines do StrCat(body,txt[i]);
  667.  
  668.  Req(body);
  669.  
  670.  FreeString(body);
  671. end;
  672. {///}
  673.  
  674. {///"FUNCTION EditHookCode"}
  675. FUNCTION EditHookCode : Integer;
  676. VAR Str : String;
  677. Begin
  678.  {$A    move.l  a2,_MySGWork
  679.         move.l  a1,_SGH      }
  680.  
  681.  { Bei bestimmten Tasten (siehe unten) in Verbindung mit der rechten
  682.    AMIGA-Taste wird der Event direkt an den IDCMP Port des Fensters
  683.    weitergeschickt und werden dort als VanillaKey oder MenuPick
  684.    verarbeitet. }
  685.  If (MySGWork^.IEvent^.ie_Qualifier AND IEQUALIFIER_RCOMMAND)=IEQUALIFIER_RCOMMAND then
  686.   Begin
  687.    Case Chr(MySGWork^.Code) of
  688.     'h' : MySGWork^.Actions:=SGA_END+SGA_REUSE;  { (h)ide (Menu) }
  689.     'a' : MySGWork^.Actions:=SGA_END+SGA_REUSE;  { (a)bout (Menu) }
  690.     'q' : MySGWork^.Actions:=SGA_END+SGA_REUSE;  { (q)uit (Menu) }
  691.    end;
  692.   end;
  693.  EditHookCode:=-1;
  694. end;
  695. {///}
  696.  
  697. {///"PROCEDURE ProcessIDCMP"}
  698. PROCEDURE ProcessIDCMP;
  699. VAR Msg : IntuiMessagePtr;
  700.     Class : Integer;
  701.     Code, Qual : Short;
  702.     Gadgetnum: Short;
  703.     Iadr : GadgetPtr;
  704.     StrInfo : StringInfoPtr;
  705.     Secs, Micros, OldSecs, OldMicros : Integer;
  706.  
  707. begin
  708.  REPEAT
  709.   i:=Wait(cxsigflag OR (1 shl Win^.UserPort^.mp_SigBit) OR SIGBREAKF_CTRL_C);
  710.  
  711.   If i=SIGBREAKF_CTRL_C then CleanExit(NIL,0);
  712.  
  713.   If i=cxsigflag then
  714.   { CXMsg -> zum Hauptprogramm zurück }
  715.    Begin
  716.     CloseWin;
  717.     Return;
  718.    end;
  719.  
  720.   Msg:=GT_GetIMsg(Win^.UserPort);
  721.   While Msg<>NIL do
  722.    BEGIN
  723.     Class:=Msg^.Class;
  724.     Code:=Msg^.Code;
  725.     Qual:=Msg^.Qualifier;
  726.     Secs:=Msg^.Seconds;
  727.     Micros:=Msg^.Micros;
  728.     IF Class=IDCMP_GADGETUP THEN Iadr:=Msg^.Iaddress;
  729.     GT_ReplyIMsg(Msg);
  730.  
  731.     IF Class=IDCMP_GADGETUP THEN
  732.      BEGIN
  733.       GadgetNum:=Iadr^.GadgetID;
  734.       CASE Gadgetnum of
  735.        0 : Begin 
  736.             num:=Code;
  737.  
  738.             StrInfo:=Gads[1]^.SpecialInfo;
  739.             If (DoubleClick(OldSecs,OldMicros,Secs,Micros)) and 
  740.                (StrEq(StrInfo^.Buffer,GetNumber(Code))) then
  741.              Begin
  742.               LockWindow(Win,adr(null_request));
  743.               Dial(GetNumber(Code));
  744.               UnlockWindow(Win,adr(null_request));
  745.              end;
  746.  
  747.             OldSecs:=Secs;
  748.             OldMicros:=Micros;
  749.             
  750.             TagList:=CreateTagList(GTST_String,GetNumber(Code),
  751.                                    TAG_END);
  752.             GT_SetGadgetAttrsA(Gads[1],Win,NIL,TagList);
  753.             FreetagItems(TagList);
  754.            end;
  755.        1 : Begin
  756.             num:=-1;
  757.             TagList:=CreateTagList(GTLV_Selected,num,
  758.                                    TAG_END);
  759.             GT_SetGadgetAttrsA(Gads[0],Win,NIL,TagList);
  760.             FreeTagItems(TagList);
  761.            end;
  762.        2 : Begin
  763.             StrInfo:=Gads[1]^.SpecialInfo;
  764.             lockWindow(Win,adr(null_request));
  765.             Dial(StrInfo^.Buffer);
  766.             UnlockWindow(Win,adr(null_request));
  767.            end;
  768.        3 : Begin
  769.             CloseWin;
  770.             Return;
  771.            end;
  772.       END;
  773.      END;
  774.  
  775.     If Class=IDCMP_VANILLAKEY then
  776.      Begin
  777.       Case Code of
  778.        13       : Begin     { RETURN }
  779.                    StrInfo:=Gads[1]^.SpecialInfo;
  780.                    lockWindow(Win,adr(null_request));
  781.                    Dial(StrInfo^.Buffer);
  782.                    UnlockWindow(Win,adr(null_request));
  783.                   end;
  784.        27       : Begin     { ESC }
  785.                    CloseWin;
  786.                    Return;
  787.                   end;
  788.        Ord('0')..Ord('9') : If ActivateGadget(Gads[1],Win,NIL) then; { Zahl gedrückt -> StrGad aktivieren }
  789.        else
  790.         Begin
  791.          i:=SearchName(Chr(Code));
  792.          If i>=0 then
  793.           Begin
  794.            num:=i;
  795.            TagList:=CreateTagList(GTLV_Selected,num,
  796.                                   GTLV_Top,num,
  797.                                   TAG_END);
  798.            GT_SetGadgetAttrsA(Gads[0],Win,NIL,TagList);
  799.            FreeTagItems(TagList);
  800.  
  801.            { Strgad aktualisieren }
  802.            TagList:=CreateTagList(GTST_String,GetNumber(num),
  803.                                   TAG_END);
  804.            GT_SetGadgetAttrsA(Gads[1],Win,NIL,TagList);
  805.            FreetagItems(TagList);
  806.           end;
  807.         end;
  808.       end;
  809.      end;
  810.  
  811.     If Class=IDCMP_RAWKEY then
  812.      Begin
  813.       Case ($7F AND Code) of
  814.        77       : Begin
  815.                    If ((Qual AND IEQUALIFIER_LSHIFT)<>0) or 
  816.                       ((Qual AND IEQUALIFIER_RSHIFT)<>0) then
  817.                     Begin
  818.                      Inc(num,8);   { Shift + Cursor runter: einen Eintrag vor }
  819.                      If num>=entries then num:=entries-1;
  820.                     end
  821.                    else
  822.                     Begin
  823.                      Inc(num);     { Cursor runter: einen Eintrag vor }
  824.                      If num>=entries then num:=entries-1;
  825.                     end;
  826.  
  827.                    If OS3 then
  828.                     Begin
  829.                      TagList:=CreateTagList(GTLV_Selected,num,
  830.                                             GTLV_MakeVisible,num,
  831.                                             TAG_END);
  832.                     end
  833.                    else
  834.                     Begin
  835.                      TagList:=CreateTagList(GTLV_Selected,num,
  836.                                             GTLV_Top,num,
  837.                                             TAG_END);
  838.                     end;
  839.                    GT_SetGadgetAttrsA(Gads[0],Win,NIL,TagList);
  840.                    FreeTagItems(TagList);
  841.  
  842.                     { Strgad aktualisieren }
  843.                    TagList:=CreateTagList(GTST_String,GetNumber(num),
  844.                                           TAG_END);
  845.                    GT_SetGadgetAttrsA(Gads[1],Win,NIL,TagList);
  846.                    FreetagItems(TagList);
  847.  
  848.                   end;
  849.        76       : Begin
  850.                    If ((Qual AND IEQUALIFIER_LSHIFT)<>0) or 
  851.                       ((Qual AND IEQUALIFIER_RSHIFT)<>0) then
  852.                     Begin
  853.                      Dec(num,8);   { Shift + Cursor hoch: einen Eintrag zurück }
  854.                      If num<0 then num:=0;
  855.                     end
  856.                    else
  857.                     begin
  858.                      Dec(num);     { Cursor hoch: einen Eintrag zurück }
  859.                      If num<0 then num:=0;
  860.                     end;
  861.                    
  862.                    If OS3 then
  863.                     Begin
  864.                      TagList:=CreateTagList(GTLV_Selected,num,
  865.                                             GTLV_MakeVisible,num,
  866.                                             TAG_END);
  867.                     end
  868.                    else
  869.                     Begin
  870.                      TagList:=CreateTagList(GTLV_Selected,num,
  871.                                             GTLV_Top,num,
  872.                                             TAG_END);
  873.                     end;
  874.                    GT_SetGadgetAttrsA(Gads[0],Win,NIL,TagList);
  875.                    FreeTagItems(TagList);
  876.                   
  877.                     { Strgad aktualisieren }
  878.                    TagList:=CreateTagList(GTST_String,GetNumber(num),
  879.                                           TAG_END);
  880.                    GT_SetGadgetAttrsA(Gads[1],Win,NIL,TagList);
  881.                    FreetagItems(TagList);
  882.                   end;
  883.      end;
  884.     end;
  885.  
  886.  
  887.     CASE Class of
  888.      IDCMP_MENUPICK : Begin
  889.                        If MenuNum(Code)=0 then
  890.                         Begin
  891.                          Case ItemNum(Code) of
  892.                           0 : Begin
  893.                                CloseWin;
  894.                                Return;
  895.                               end;
  896.                           1 : Begin
  897.                                lockWindow(Win,adr(null_request));
  898.                                About;
  899.                                UnlockWindow(Win,adr(null_request));
  900.                               end;
  901.                           2 : CleanExit(NIL,0);
  902.                          end;
  903.                         end;
  904.                        If MenuNum(Code)=1 then
  905.                         Begin
  906.                          Case ItemNum(Code) of
  907.                           0 : Begin
  908.                                TagList:=CreateTagList(GTLV_Labels,-1,
  909.                                                       TAG_END);
  910.                                GT_SetGadgetAttrsA(Gads[0],Win,NIL,TagList);
  911.                                FreeTagItems(TagList);
  912.  
  913.                                FreeNumbers;
  914.                                Dispose(Numbers);
  915.                                New(Numbers);
  916.                                NewList(Numbers);
  917.                                ReadPhoneBook;
  918.  
  919.                                TagList:=CreateTagList(GTLV_Labels,Numbers,
  920.                                                       TAG_END);
  921.                                GT_SetGadgetAttrsA(Gads[0],Win,NIL,TagList);
  922.                                FreeTagItems(TagList);
  923.                               end;
  924.                          end;
  925.                         end;
  926.  
  927.                       end;
  928.      IDCMP_REFRESHWINDOW : BEGIN
  929.                             GT_BeginRefresh(Win);
  930.                             GT_EndRefresh(Win,TRUE);
  931.                            END;
  932.      IDCMP_CLOSEWINDOW : Begin
  933.                           CloseWin;
  934.                           Return;
  935.                          end;
  936.     END;
  937.     Msg:=GT_GetIMsg(Win^.UserPort);
  938.    END;
  939.  UNTIL FALSE;
  940. end;
  941. {///}
  942.  
  943. {///"PROCEDURE LayoutGadgets"}
  944. PROCEDURE LayoutGadgets;
  945. VAR YSize : Integer;
  946.     IText : IntuiText;  { Die Länge der Texte werden über IntuiTextLength() ermittelt }
  947.     GadgetWidth : Integer;
  948. Begin
  949.  YSize:=ScrFont^.ta_YSize+5;
  950.  
  951.  IText.ITextFont:=ScrFont;
  952.  IText.IText:=longname; { Längster Name aus Telefonbuch }
  953.  Win_Width:=IntuiTextLength(adr(Itext))+40;
  954.  
  955.  If Win_Width>Scr^.Width then
  956.   Begin
  957.    ScrFont:=adr(TopazAttr);   { Wenn der Font zu groß ist auf Topaz zurückstellen }
  958.    IText.ITextFont:=ScrFont;
  959.    IText.IText:=longname;
  960.    Win_Width:=IntuiTextLength(adr(Itext))+40;
  961.   end;
  962.  
  963.  IText.ITextFont:=ScrFont;
  964.  IText.IText:="Verbergen";
  965.  GadgetWidth:=IntuiTextLength(adr(Itext))+10;
  966.  
  967.  If Win_Width<2*GadgetWidth+40 then Win_Width:=2*GadgetWidth+40;
  968.  
  969.  { ListView }
  970.  ng[0].ng_TopEdge:=YSize+8;
  971.  ng[0].ng_Width:=Win_Width-20;
  972.  ng[0].ng_Height:=YSize*8;
  973.  
  974.  { Nummer }
  975.  ng[1].ng_TopEdge:=ng[0].ng_TopEdge+ng[0].ng_Height+8;
  976.  ng[1].ng_Width:=Win_Width-20;
  977.  ng[1].ng_Height:=YSize+2;
  978.  
  979.  { Wählen }
  980.  ng[2].ng_TopEdge:=ng[1].ng_TopEdge+ng[1].ng_Height+7;
  981.  ng[2].ng_Width:=GadgetWidth;
  982.  ng[2].ng_Height:=YSize+4;
  983.  
  984.  { Verbergen }
  985.  ng[3].ng_LeftEdge:=ng[0].ng_LeftEdge+ng[0].ng_Width-ng[2].ng_Width;
  986.  ng[3].ng_TopEdge:=ng[2].ng_TopEdge;
  987.  ng[3].ng_Width:=ng[2].ng_Width;
  988.  ng[3].ng_Height:=YSize+4;
  989.  
  990.  Win_Height:=ng[3].ng_TopEdge+ng[3].ng_Height+5;
  991.  If Win_Height>Scr^.Height then CleanExit("Bildauflösung zu klein !",10);
  992.   { Sollte eigentlich nicht passieren, oder hat jemand einen Screen, der nur 100
  993.     Pixel hoch ist ? }
  994. end;
  995. {///}
  996.  
  997. {///"PROCEDURE OpenWin"}
  998. PROCEDURE OpenWin;
  999. const
  1000.  IDCMP=IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR IDCMP_VANILLAKEY OR
  1001.        IDCMP_MENUPICK OR IDCMP_RAWKEY OR LISTVIEWIDCMP;
  1002.  
  1003. Begin
  1004.  New(GList);
  1005.  
  1006.  Scr:=LockPubScreen(NIL);  { WB Screen ... }
  1007.  If Scr=NIL then CleanExit("Bekomme keinen lock auf WB-Screen",10);
  1008.  
  1009.  ScrFont:=Scr^.Font;
  1010.  
  1011.  vi:=GetVisualInfoA(Scr,NIL);
  1012.  IF vi=NIL THEN CleanExit("Bekomme kein VisualInfo vom Public-Screen",10);
  1013.  
  1014.  Gads[0] := CreateContext( Adr(GList) );  { !! Address of GadgetPtr !! }
  1015.  IF Gads[0]=NIL THEN CleanExit("Kann Gadgets nicht erstellen",10);
  1016.  
  1017.  MyHook.h_Entry:=adr(EditHookCode);
  1018.  TagList:=CreateTagList(GTLV_Labels,Numbers,
  1019.                         GTLV_ShowSelected,NIL,
  1020.                         GTLV_Selected,num,
  1021.                         GTST_String,GetNumber(num),
  1022.                         GTST_EditHook,adr(MyHook),
  1023.                         TAG_DONE     );
  1024.  
  1025.  LayoutGadgets;
  1026.  
  1027.  ng[0].ng_VisualInfo:=vi;
  1028.  ng[0].ng_TextAttr:=ScrFont;
  1029.  Gads[0]:=CreateGadgetA(Gadget_Types[0],Gads[0],adr(ng[0]),TagList);
  1030.  For i:=1 to 3 do
  1031.   BEGIN
  1032.    ng[i].ng_VisualInfo:=vi;
  1033.    ng[i].ng_TextAttr:=ScrFont;
  1034.    Gads[i]:=CreateGadgetA(Gadget_Types[i],Gads[i-1],adr(ng[i]),TagList);
  1035.   END;
  1036.  
  1037.  FreeTagItems(TagList);
  1038.  IF Gads[3]=NIL THEN CleanExit("Kann Gadgets nicht erzeugen",10);
  1039.  
  1040.  If OS3 then
  1041.   Begin
  1042.    TagList:=CreateTagList(GTMN_FrontPen,1,     { Ab OS3.0 FronPen auf 1 setzten, }
  1043.                           TAG_END);
  1044.   end
  1045.  else TagList:=NIL;                            { darunter: default = 0           }
  1046.  MenuStrip:=CreateMenusA(adr(nm),TagList);
  1047.  If TagList<>NIL then FreeTagItems(TagList);
  1048.  
  1049.  If MenuStrip=NIL then CleanExit("Kann Menu nicht erzeugen",10);
  1050.  If LayoutMenusA(MenuStrip,vi,NIL)=FALSE then CleanExit("Kann Menu nicht erzeugen",10);
  1051.  
  1052.  StrCpy(Title,"Dial: Hotkey = <");
  1053.  StrCat(Title,CX_POPKEY);
  1054.  StrCat(Title,">");
  1055.  
  1056.  TagList:=CreateTagList(WA_Left,Scr^.MouseX-(Win_Width div 2),
  1057.                         WA_Top,Scr^.MouseY-(Win_Height div 2),
  1058.                         WA_InnerWidth,Win_Width,
  1059.                         WA_InnerHeight,Win_Height,
  1060.                         WA_Title,Title,
  1061.                         WA_CustomScreen,Scr,
  1062.                         WA_Gadgets,GList,
  1063.                         WA_IDCMP,IDCMP,
  1064.                         WA_DragBar,TRUE,
  1065.                         WA_NewLookMenus,TRUE,
  1066.                         WA_CloseGadget,TRUE,
  1067.                         WA_DepthGadget,TRUE,
  1068.                         WA_GimmeZeroZero,TRUE,
  1069.                         WA_Activate,TRUE,
  1070.                         TAG_DONE   );
  1071.  
  1072.  Win:=OpenWindowTagList(NIL,TagList);
  1073.  FreeTagItems(TagList);
  1074.  IF Win=NIL THEN CleanExit("Kann Fenster nicht öffnen",10);
  1075.  IF NOT SetMenuStrip(Win,MenuStrip) THEN CleanExit("Kann Menu nicht erzeugen !",10);
  1076.  GT_RefreshWindow(Win,NIL);
  1077. end;
  1078. {///}
  1079.  
  1080. {///"PROCEDURE ProcessToolTypes"}
  1081. PROCEDURE ProcessToolTypes;
  1082. VAR  WBMsg : WBStartupPtr;
  1083.      i : Integer;
  1084.      DiskObj : DiskObjectPtr;
  1085.      OldLock : FileLock;
  1086.      ToolTypes : Address;
  1087.      Str : String;
  1088.  
  1089. Begin
  1090.   { "Voreinstellungen", falls beim ToolType-lesen etwas schiefgeht
  1091.     werden diese Werte genommen }
  1092.   StrCpy(CX_POPKEY,StdHotkey);
  1093.   CX_POPUP:=TRUE;
  1094.   CX_PRIORITY:=0;
  1095.   StrCpy(PhoneBook,StdPhoneBook);
  1096.   SortList:=TRUE;
  1097.  
  1098.   WBMsg:=GetStartupMsg;
  1099.   If WBMsg=NIL then Return;  { Vom CLI gestartet }
  1100.  
  1101.   DirLock:=WBMsg^.sm_ArgList^[1].wa_Lock;
  1102.  
  1103.   IconBase:=OpenLibrary(ICONNAME,0);
  1104.   If IconBase=NIL then Return;
  1105.  
  1106.   OldLock:=CurrentDir(WBMSg^.sm_ArgList^[1].wa_Lock);
  1107.   DiskObj:=GetDiskObject(WBMsg^.sm_ArgList^[1].wa_Name);
  1108.   
  1109.   If DiskObj=NIL then 
  1110.    Begin
  1111.     CloseLibrary(IconBase);
  1112.     Return;
  1113.    end;
  1114.  
  1115.   ToolTypes:=DiskObj^.do_ToolTypes;
  1116.  
  1117.   Str:=FindToolType(ToolTypes,"CX_POPUP");
  1118.   If MatchToolValue(Str,"NO") then CX_POPUP:=FALSE else CX_POPUP:=TRUE;
  1119.  
  1120.   Str:=FindToolType(ToolTypes,"CX_POPKEY");
  1121.   StrCpy(CX_POPKEY,Str);
  1122.   If StrEQ(CX_POPKEY,"") then StrCpy(CX_POPKEY,StdHotkey);
  1123.  
  1124.   Str:=FindToolType(ToolTypes,"CX_PRIORITY");
  1125.   i:=StrToLong(Str,adr(CX_PRIORITY));
  1126.   If (CX_PRIORITY>127) or (CX_PRIORITY<-127) then CX_PRIORITY:=0;
  1127.  
  1128.   Str:=FindToolType(ToolTypes,"PhoneBook");
  1129.   StrCpy(PhoneBook,Str);
  1130.   If StrEQ(PhoneBook,"") then StrCpy(PhoneBook,StdPhoneBook);
  1131.  
  1132.   Str:=FindToolType(ToolTypes,"Sort");
  1133.   If MatchToolValue(Str,"NO") then SortList:=FALSE;
  1134.  
  1135.   OldLock:=CurrentDir(OldLock);
  1136.   FreeDiskObject(DiskObj);
  1137.   CloseLibrary(IconBase);
  1138. end;
  1139. {///}
  1140.  
  1141. {///"PROCEDURE ProcessArgs"}
  1142. PROCEDURE ProcessArgs;
  1143. const template = "CP=CX_PRIORITY/N,CK=CX_POPKEY/K,CU=CX_POPUP/K,PH=PhoneBook/K,Sort/K";
  1144.  
  1145. VAR  rda : RDArgsPtr;
  1146.      vec : Array[0..4] of Address;
  1147.  
  1148. BEGIN
  1149.   { "Voreinstellungen", falls bei ReadArgs() etwas schiefgeht oder ein 
  1150.     Argument nicht angegeben ist werden diese Werte genommen. }
  1151.   StrCpy(CX_POPKEY,StdHotkey);
  1152.   CX_POPUP:=TRUE;
  1153.   CX_PRIORITY:=0;
  1154.   StrCpy(PhoneBook,StdPhoneBook);
  1155.   SortList:=TRUE;
  1156.  
  1157.   vec[0]:=NIL;
  1158.   vec[1]:=NIL;  { Die Werte immer vorher mit NULL belegen !  }
  1159.   vec[2]:=NIL;  { Wenn ein Argument nicht angegeben ist wird }
  1160.   vec[3]:=NIL;  { der Wert nicht verändert.                  }
  1161.   vec[4]:=NIL;
  1162.  
  1163.   rda:=ReadArgs(Template,adr(vec),NIL);
  1164.   If rda=NIL then
  1165.    Begin
  1166.     If PrintFault(IoErr,NIL) then;
  1167.     CleanExit(NIL,0);
  1168.    end;
  1169.  
  1170.   If vec[0]<>NIL then CopyMem(vec[0],adr(CX_PRIORITY),4);
  1171.   If vec[1]<>NIL then StrCpy(CX_POPKEY,vec[1]);
  1172.   If vec[2]<>NIL then StrCpy(Str,vec[2]);
  1173.   If StriEq(Str,"NO") then CX_POPUP:=FALSE;
  1174.   If vec[3]<>NIL then StrCpy(PhoneBook,vec[3]);
  1175.   If vec[4]<>NIL then StrCpy(Str,vec[4]);
  1176.   If StriEq(Str,"NO") then SortList:=FALSE;
  1177.  
  1178.   If (CX_PRIORITY>127) or (CX_PRIORITY<-127) then CX_PRIORITY:=0;
  1179.  
  1180.   FreeArgs(rda);
  1181. END;
  1182. {///}
  1183.  
  1184. {///"PROCEDURE OpenAll"}
  1185. PROCEDURE OpenAll;
  1186. VAR l : FileLock;
  1187.     WBMsg : WBStartupPtr;
  1188.     FromWB : Boolean;
  1189.  
  1190. Begin
  1191.  Title:=AllocString(100);
  1192.  CX_POPKEY:=AllocString(100);
  1193.  Str:=AllocString(200);
  1194.  PhoneBook:=AllocString(100);
  1195.  longname:=AllocString(100);
  1196.  
  1197.  New(Numbers);
  1198.  NewList(Numbers);
  1199.  
  1200.  WBMsg:=GetStartupMsg;
  1201.  If WBMsg<>NIL then FromWB:=TRUE else FromWB:=FALSE;
  1202.  
  1203.  If FromWB then
  1204.   ProcessToolTypes
  1205.  else
  1206.   ProcessArgs;
  1207.  
  1208.  UtilityBase:=OpenLibrary("utility.library",37);
  1209.  IF UtilityBase=NIL THEN CleanExit("Benötige mindestens OS V2.0 !",20);
  1210.  
  1211.  If LibraryPtr(UtilityBase)^.lib_Version>=39 then OS3:=TRUE else OS3:=FALSE;
  1212.  
  1213.  GadToolsBase:=OpenLibrary("gadtools.library",37);
  1214.  IF GadToolsBase=NIL THEN CleanExit("Kann GadTools.Library nicht öffnen !??",10);
  1215.  
  1216.  IB:=IntuitionBasePtr(OpenLibrary("intuition.library",37));
  1217.  If IB=NIL then CleanExit("Kann intuition.library nicht öffnen !??",10);
  1218.  
  1219.  CxBase := OpenLibrary("commodities.library", 37);
  1220.  If CxBase=NIL then CleanExit("Benötige die Commodities.library !",10);
  1221.  
  1222.  broker_mp := CreateMsgPort;
  1223.  If broker_mp=NIL then CleanExit("Kann Broker-Port nicht erstellen !??",10);
  1224.  
  1225.  cxsigflag := 1 shl broker_mp^.mp_SigBit;
  1226.  nb.nb_Port := broker_mp;
  1227.  nb.nb_Pri:=CX_PRIORITY;
  1228.  
  1229.  broker := CxBroker(adr(nb), NIL);
  1230.  If Broker=NIL then CleanExit(NIL,10);  { Wenn das passiert wurde das Programm
  1231.                                           ein zweites Mal gestartet. Das zuerst
  1232.                                           gestartete Programm erhält eine Message
  1233.                                           und öffnet sein Fenster. }
  1234.  
  1235.  filter := CreateCxObj(CX_FILTER, Integer(CX_POPKEY) ,0);
  1236.  AttachCxObj(broker, filter);
  1237.  sender := CreateCxObj(CX_SEND,Integer(broker_mp), EVT_HOTKEY);
  1238.  AttachCxObj(filter, sender);
  1239.  Ctranslate := CreateCxObj(CX_TRANSLATE,0,0);
  1240.  AttachCxObj(filter, Ctranslate);
  1241.  
  1242.  If CxObjError(filter)<>0 then 
  1243.   Begin
  1244.    StrCpy(Str,"Fehler bei der Installation des Hotkeys:\n");
  1245.    StrCat(Str,CX_POPKEY);
  1246.    StrCat(Str,"\nBitte überprüfen Sie CX_POPKEY !");
  1247.    CleanExit(Str,10);
  1248.   end;
  1249.  If ActivateCxObj(broker, 1)=0 then;
  1250.  
  1251.  ReadPhoneBook;
  1252. end;
  1253. {///}
  1254.  
  1255. {///"Main"}
  1256. Begin
  1257.  OpenAll;
  1258.  
  1259.  If CX_POPUP=TRUE then
  1260.   Begin
  1261.    OpenWin;
  1262.    ProcessIDCMP;
  1263.   end;
  1264.  
  1265.  returnvalue:=TRUE;
  1266.  while returnvalue do
  1267.   Begin
  1268.    i := Wait(cxsigflag OR SIGBREAKF_CTRL_C);
  1269.  
  1270.    If i=SIGBREAKF_CTRL_C then CleanExit(NIL,0);
  1271.  
  1272.    CMsg:=CXMsgPtr(GetMsg(broker_mp));
  1273.    While CMsg<>NIL do
  1274.     Begin
  1275.      msgid := CxMsgID(Cmsg);
  1276.      msgtype := CxMsgType(Cmsg);
  1277.      ReplyMsg(MessagePtr(Cmsg));
  1278.  
  1279.      Case MsgType of
  1280.       CXM_IEVENT : Begin
  1281.                     If msgid=EVT_HOTKEY then
  1282.                      Begin
  1283.                       OpenWin;
  1284.                       ProcessIDCMP;
  1285.                      end;
  1286.                    end;
  1287.       CXM_COMMAND : Begin
  1288.                      Case msgid of
  1289.                       CXCMD_APPEAR  : Begin
  1290.                                        OpenWin;
  1291.                                        ProcessIDCMP;
  1292.                                       end;
  1293.                       CXCMD_DISABLE : Begin
  1294.                                        If ActivateCxObj(broker, 0)=0 then;
  1295.                                       end;
  1296.                       CXCMD_ENABLE  : begin
  1297.                                        If ActivateCxObj(broker, 1)=0 then;
  1298.                                       end;
  1299.                       CXCMD_KILL    : Begin
  1300.                                        returnvalue := FALSE;
  1301.                                       end;
  1302.                       CXCMD_UNIQUE  : Begin
  1303.                                        { Programm neu gestartet }
  1304.                                        OpenWin;
  1305.                                        ProcessIDCMP;
  1306.                                       end;
  1307.                      end;
  1308.                     end;
  1309.      end;
  1310.  
  1311.      CMsg:=CXMsgPtr(GetMsg(broker_mp));
  1312.     end;
  1313.   end;
  1314.  
  1315.  CleanExit(NIL,0);
  1316. end.
  1317. {///}
  1318.  
  1319.